home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / misc.s < prev    next >
Text File  |  1999-12-19  |  10KB  |  446 lines

  1.     .include    doscall.mac
  2.     .include    srammap.equ
  3.     .include    global.mac
  4.  
  5. ;----------------------------------------------------------------
  6. ;フレーム数をMSF形式の文字列に変換する
  7. ;<d0.l:フレーム数
  8. ;<a0.l:バッファの先頭
  9. ;>d0.l:フレーム数(MSF形式)
  10. ;>a0.l:文字列の末尾の0の位置
  11.     .text
  12.     .align    4,$2048
  13. frm2str_len::
  14.     sub.l    #75*2,d0        ;frm2msfが2秒増やしてしまうので調整しておく
  15.     bsr    frm2msf
  16.     bra    tim2str_len
  17.  
  18. ;----------------------------------------------------------------
  19. ;MSF形式のフレーム番号を文字列に変換する
  20. ;<d0.l:フレーム番号(MSF形式)
  21. ;<a0.l:バッファの先頭
  22. ;>a0.l:文字列の末尾の0の位置
  23.     .text
  24.     .align    4,$2048
  25. tim2str_len::
  26.     move.l    d0,-(sp)
  27.     move.b    #"'",(2,a0)
  28.     move.b    #'"',(5,a0)
  29.     bra    @f
  30. tim2str_pos::
  31.     move.l    d0,-(sp)
  32.     move.b    #':',(2,a0)
  33.     move.b    #':',(5,a0)
  34. @@:    moveq.l    #100,d0
  35.     add.b    (1,sp),d0
  36.     move.b    (tim2str_table_10-100,pc,d0.l),(a0)+
  37.     move.b    (tim2str_table_1-100,pc,d0.l),(a0)+
  38.     addq.l    #1,a0
  39.     moveq.l    #100,d0
  40.     add.b    (2,sp),d0
  41.     move.b    (tim2str_table_10-100,pc,d0.l),(a0)+
  42.     move.b    (tim2str_table_1-100,pc,d0.l),(a0)+
  43.     addq.l    #1,a0
  44.     moveq.l    #100,d0
  45.     add.b    (3,sp),d0
  46.     move.b    (tim2str_table_10-100,pc,d0.l),(a0)+
  47.     move.b    (tim2str_table_1-100,pc,d0.l),(a0)+
  48.     clr.b    (a0)
  49.     move.l    (sp)+,d0
  50.     rts
  51.  
  52. tim2str_table_10:
  53.   .irp c,'0','1','2','3','4','5','6','7','8','9'
  54.     .dc.b    c,c,c,c,c,c,c,c,c,c
  55.   .endm
  56. tim2str_table_1:
  57.   .rept 10
  58.     .dc.b    '0123456789'
  59.   .endm
  60.     .even
  61.  
  62. ;----------------------------------------------------------------
  63. ;アスキーコードで表示できない文字を'\x??'に変換してバッファに書き込む
  64. ;<d0.b:文字
  65. ;<a0.l:バッファ
  66. ;>a0.l:バッファの次の位置(+1または+4される)
  67.     .text
  68.     .align    4,$2048
  69. encode_esc::
  70.     cmp.b    #' ',d0
  71.     blo    1f
  72.     cmp.b    #$7E,d0
  73.     bhi    1f
  74.     move.b    d0,(a0)+
  75.     rts
  76.  
  77. 1:    move.b    #'\',(a0)+
  78.     move.b    #'x',(a0)+
  79.     move.l    d1,-(sp)
  80.   .rept 2
  81.     rol.b    #4,d0
  82.     moveq.l    #$0F,d1
  83.     and.b    d0,d1
  84.     move.b    (7f,pc,d1.l),(a0)+
  85.   .endm
  86.     move.l    (sp)+,d1
  87.     rts
  88.  
  89. 7:    .dc.b    '0123456789abcdef'
  90.  
  91. ;----------------------------------------------------------------
  92. ;文字列を指定されたバイト数だけ[~]で括ってコピーする
  93. ;<d0.w:コピーするバイト数-1
  94. ;<a0.l:コピー先バッファの先頭
  95. ;<a1.l:コピーする文字列の先頭
  96. ;>a0.l:コピー先の文字列の末尾の0の位置
  97. ;>a1.l:コピーした文字列の末尾+1
  98.     .text
  99.     .align    4,$2048
  100. strncpy_name::
  101.     move.b    #'[',(a0)+
  102. 1:    move.b    (a1)+,(a0)+        ;CD名をコピー
  103.     dbeq    d0,1b
  104.     bne    3f
  105.     subq.l    #1,a0
  106. 2:    move.b    #' ',(a0)+
  107.     dbra    d0,2b
  108. 3:    move.b    #']',(a0)+
  109.     clr.b    (a0)
  110.     rts
  111.  
  112.   .if 0
  113. ;----------------------------------------------------------------
  114. ;MSF形式の数値のインクリメント
  115. ;<d0.l:mm:ss:ff
  116. ;>d0.l:mm:ss:ff
  117.     .text
  118.     .align    4,$2048
  119. incmsf::
  120.     cmp.b    #75-1,d0
  121.     bcc    @f
  122.     addq.b    #1,d0
  123.     rts
  124. @@:    cmp.w    #(60-1)<<8,d0
  125.     bcc    @f
  126.     add.w    #(1<<8)-(75-1),d0
  127.     rts
  128. @@:    add.l    #(1<<16)-((60-1)<<8)-(75-1),d0
  129.     rts
  130. ;----------------------------------------------------------------
  131.   .endif
  132.  
  133.   .if 0
  134. ;----------------------------------------------------------------
  135. ;MSF形式の数値のデクリメント
  136. ;    アンダーフローは無視しているので,00:00:01以上の数値を指定すること
  137. ;<d0.l:mm:ss:ff
  138. ;>d0.l:mm:ss:ff
  139.     .text
  140.     .align    4,$2048
  141. decmsf::
  142.     tst.b    d0
  143.     beq    @f
  144.     subq.b    #1,d0
  145.     rts
  146. @@:    cmp.w    #1<<8,d0
  147.     blo    @f
  148.     sub.w    #(1<<8)-(75-1),d0
  149.     rts
  150. @@:    sub.l    #(1<<16)-((60-1)<<8)-(75-1),d0
  151.     rts
  152. ;----------------------------------------------------------------
  153.   .endif
  154.  
  155.   .if 0
  156. ;----------------------------------------------------------------
  157. ;MSF形式の数値の加算
  158. ;<d0.l:mm:ss:ff
  159. ;<d1.l:mm:ss:ff
  160. ;>d0.l:mm:ss:ff
  161.     .text
  162.     .align    4,$2048
  163. addmsf::
  164.     movem.l    d1-d2,-(sp)
  165.                     ;d0=|00|m0|s0|f0|
  166.                     ;d1=|00|m1|s1|f1|
  167.     add.b    d1,d0            ;d0=|00|m0|s0|F2|
  168.     moveq.l    #-75,d2
  169.     add.b    d0,d2            ;d2=|..|..|..|f_|
  170.     bcc    @f
  171.     move.b    d2,d0            ;d0=|00|m0|s0|f2|
  172. @@:    clr.b    d1            ;d1=|00|m1|s1|00|
  173.     addx.w    d1,d0            ;d0=|00|m0|S2|f2|
  174.     move.w    #(-60)<<8,d2
  175.     add.w    d0,d2            ;d2=|..|..|s_|f2|
  176.     bcc    @f
  177.     move.w    d2,d0            ;d0=|00|m0|s2|f2|
  178. @@:    clr.w    d1            ;d1=|00|m1|00|00|
  179.     addx.l    d1,d0            ;d0=|00|M2|s2|f2|
  180.     movem.l    (sp)+,d1-d2
  181.     rts
  182. ;----------------------------------------------------------------
  183.   .endif
  184.  
  185. ;----------------------------------------------------------------
  186. ;フレーム番号をMSF形式からバイナリに変換する
  187. ;<d0.l:フレーム番号(mm:ss:ff,2秒以上)
  188. ;>d0.l:フレーム番号(0~)
  189.     .text
  190.     .align    4,$2048
  191. msf2frm::
  192.     move.l    d1,-(sp)
  193.     swap.w    d0        ;ssff00mm
  194.     moveq.l    #60,d1
  195.     mulu.w    d0,d1        ;mm*60
  196.     clr.w    d0        ;ssff0000
  197.     rol.l    #8,d0        ;ff0000ss
  198.     add.w    d0,d1        ;mm*60+ss    ;18.2時間以上のときは.wでは不可
  199.     subq.w    #2,d1        ;2秒減らす
  200.     mulu.w    #75,d1        ;(mm*60+ss)*75    ;    〃
  201.     clr.w    d0        ;ff000000
  202.     rol.l    #8,d0        ;000000ff
  203.     add.l    d1,d0        ;(mm*60+ss)*75+ff
  204.     move.l    (sp)+,d1
  205.     rts
  206.  
  207. ;----------------------------------------------------------------
  208. ;フレーム番号をバイナリからMSF形式に変換する
  209. ;<d0.l:フレーム番号(0~)
  210. ;>d0.l:フレーム番号(mm:ss:ff,2秒以上,フレーム番号が-150~のときは0秒以上)
  211.     .text
  212.     .align    4,$2048
  213. frm2msf::
  214.     add.l    #75*2,d0    ;2秒増やす(divu.wの前に行うこと)
  215.     divu.w    #75,d0        ;18.2時間以上だとオーバーフローする
  216.     swap.w    d0
  217.     move.w    d0,-(sp)    ;00ff
  218.     clr.w    d0
  219.     swap.w    d0
  220.     divu.w    #60,d0        ;00ss00mm
  221.     swap.w    d0        ;00mm00ss
  222.     lsl.w    #8,d0        ;00mmss00
  223.     or.w    (sp)+,d0    ;00mmssff
  224.     rts
  225.  
  226. ;----------------------------------------------------------------
  227. ;サンプリング周波数(Hz)からTIMERD割り込み間隔(μs)を得る
  228. ;<d0.l:サンプリング周波数(Hz)
  229. ;<d1.l:1=モノラル,2=ステレオ
  230. ;>d0.l:TIMERD割り込み間隔(μs,20~50),-1=エラー
  231.     .text
  232.     .align    4,$2048
  233. frequency_to_timerd_count::
  234.     movem.l    d1/a0,-(sp)
  235.     lea.l    (frequency_table_mono,pc),a0
  236.     cmp.l    #1,d1
  237.     beq    @f
  238.     lea.l    (frequency_table_stereo,pc),a0
  239. @@:
  240.     moveq.l    #MAX_INT-MIN_INT,d1
  241. 1:    cmp.l    (a0)+,d0
  242.     dbeq    d1,1b
  243.     bne    90f
  244.     moveq.l    #MIN_INT,d0
  245.     add.b    d1,d0
  246.     tst.l    d0
  247. 99:    movem.l (sp)+,d1/a0
  248.     rts
  249.  
  250. 90:    moveq.l    #-1,d0
  251.     bra    99b
  252.  
  253. ;----------------------------------------------------------------
  254. ;TIMERD割り込み間隔(μs)からサンプリング周波数(Hz)を得る
  255. ;<d0.b:TIMERD割り込み間隔(μs,20~50)
  256. ;<d1.l:1=モノラル,2=ステレオ
  257. ;>d0.l:サンプリング周波数(Hz),-1=エラー
  258.     .text
  259.     .align    4,$2048
  260. timerd_count_to_frequency::
  261.     movem.l    d1/a0,-(sp)
  262.     cmp.l    #MIN_INT,d0
  263.     blo    99f
  264.     cmp.l    #MAX_INT,d0
  265.     bhi    99f
  266.     lea.l    (frequency_table_mono,pc),a0
  267.     cmp.l    #1,d1
  268.     beq    @f
  269.     lea.l    (frequency_table_stereo,pc),a0
  270. @@:    moveq.l    #MAX_INT,d1
  271.     sub.w    d0,d1
  272.     add.w    d1,d1
  273.     add.w    d1,d1
  274.     move.l    (a0,d1.w),d0
  275. 99:    movem.l (sp)+,d1/a0
  276.     rts
  277.  
  278. 90:    moveq.l    #-1,d0
  279.     bra    99b
  280.  
  281. ;----------------------------------------------------------------
  282.     .text
  283.     .align    4,$2048
  284. frequency_table_mono:
  285. n = MAX_INT
  286.   .rept MAX_INT-MIN_INT+1
  287.     .dc.l    (1000000+n/2)/n
  288. n = n-1
  289.   .endm
  290.  
  291.     .align    4,$2048
  292. frequency_table_stereo:
  293. n = MAX_INT
  294.   .rept MAX_INT-MIN_INT+1
  295.     .dc.l    (1000000+n/2)/(n*2)
  296. n = n-1
  297.   .endm
  298.  
  299. ;----------------------------------------------------------------
  300. ;抑制つき表示
  301.     .text
  302.     .align    4,$2048
  303. silent_eprintcrlf::
  304.     tst.b    silent_flag
  305.     beq    eprintcrlf
  306.     rts
  307.  
  308.     .align    4,$2048
  309. silent_eprint::
  310.     tst.b    silent_flag
  311.     beq    eprint
  312.     rts
  313.  
  314.     .align    4,$2048
  315. silent_eputchar::
  316.     tst.b    silent_flag
  317.     beq    eputchar
  318.     rts
  319.  
  320.     .align    4,$2048
  321. silent_ecrlf::
  322.     tst.b    silent_flag
  323.     beq    ecrlf
  324.     rts
  325.  
  326. ;----------------------------------------------------------------
  327. ;エンディアンの変換(68000用)
  328. ;    データの本体はバッファの先頭から後ろに1バイトずらした位置に用意しておくこと
  329. ;    68000専用,68030以降はローテート命令を使った方が速い
  330. ;    movepを展開しないこと
  331. ;<d0.l:データの長さ(8の倍数)
  332. ;<a0.l:出力バッファの先頭=入力データの先頭-1
  333. ;?d0-d1/a0
  334.     .text
  335.     .align    4,$2048
  336. convert_endian_68000::
  337.     subq.l    #1,d0
  338.     bcs    99f            ;データがない(念のため)
  339.   .if TEST_68000
  340.     .if 1    ;movepのルーチンをテストする
  341.     bra    9f
  342.     .else
  343.     IS68000    d1
  344.     beq    9f
  345.     .endif
  346.     swap.w    d0
  347. 2:    swap.w    d0
  348. 1:    move.b    (2,a0),(a0)
  349.     addq.l    #2,a0
  350.     dbra    d0,1b
  351.     swap.w    d0
  352.     dbra    d0,2b
  353.     rts
  354. 9:
  355.   .endif
  356.     and.b    #$F8,d0
  357.     move.l    d0,d1
  358.     clr.b    d1
  359.     sub.w    d1,d0
  360.     lsr.l    #8,d1
  361.     eori.b    #$F8,d0
  362.     suba.w    d0,a0
  363.     jmp    (2f,pc,d0.w)
  364. 1:    swap.w    d1
  365. 2:
  366. n = 0
  367.   .rept 32
  368.     movep.l    (n+2,a0),d0        ;24
  369.     movep.l    d0,(n,a0)        ;24
  370.                     ;1ワードあたり12クロック
  371. n = n+8
  372.   .endm
  373.     lea.l    (256,a0),a0
  374.     dbra    d1,2b
  375.     swap.w    d1
  376.     dbra    d1,1b
  377. 99:    rts
  378.  
  379. ;----------------------------------------------------------------
  380. ;SCSIのハード転送/ソフト転送を変更する
  381.     .text
  382.     .align    4,$2048
  383. scsi_hard_soft_on::
  384.     tst.b    hard_soft
  385.     bmi    99f
  386.     tst.b    scsi_hard_soft_level
  387.     bne    10f
  388.     bsr    sram_write_enable
  389.     bsr    super
  390.     tst.b    hard_soft
  391.     bne    1f
  392.     bclr.b    #4,SRAM_SCSI_FLAG    ;強制的にハード転送にする
  393.     bra    2f
  394. 1:    bset.b    #4,SRAM_SCSI_FLAG    ;強制的にソフト転送にする
  395. 2:
  396.     sne.b    scsi_hard_soft_old
  397.     bsr    user
  398.     bsr    sram_write_disable
  399. 10:    addq.b    #1,scsi_hard_soft_level
  400. 99:    rts
  401.  
  402.     .data
  403. scsi_hard_soft_level::    .dc.b    0    ;0以外=ソフト転送
  404. scsi_hard_soft_old:    .dc.b    0    ;元のソフト転送モード
  405.  
  406. ;----------------------------------------------------------------
  407. ;SCSIのハード転送/ソフト転送を元に戻す
  408.     .text
  409.     .align    4,$2048
  410. scsi_hard_soft_off::
  411.     tst.b    scsi_hard_soft_level
  412.     beq    99f
  413.     subq.b    #1,scsi_hard_soft_level
  414.     bne    @f
  415.     bsr    sram_write_enable
  416.     bsr    super
  417.     tst.b    scsi_hard_soft_old
  418.     bne    1f
  419.     bclr.b    #4,SRAM_SCSI_FLAG
  420.     bra    2f
  421. 1:    bset.b    #4,SRAM_SCSI_FLAG
  422. 2:    bsr    user
  423.     bsr    sram_write_disable
  424. 99:    rts
  425.  
  426. ;----------------------------------------------------------------
  427. ;新規ファイルを書き込みモードでオープンする
  428. ;<a0.l:ファイル名
  429. ;>d0.l:ファイルハンドル,負数=エラー
  430.     .text
  431.     .align    4,$2048
  432. wopen::
  433.     move.w    #$0020,-(sp)
  434.     move.l    a0,-(sp)
  435.     DOS    _CREATE
  436.     addq.l    #6,sp
  437.     tst.l    d0
  438.     bpl    @f
  439.     move.w    #1,-(sp)
  440.     move.l    a0,-(sp)
  441.     DOS    _OPEN
  442.     addq.l    #6,sp
  443.     tst.l    d0
  444. @@:    rts
  445.  
  446.